跳到主要内容

密码学与算法

密码技术在区块链中的应用

区块链使用区块链系统中,使用了哈希函数、非对称加密等密码技术来保证分布式账本信息的完整性。使用非对称性加密技术,有效地解决了密钥分发传输的问题,而私钥加密–公钥解密的应用模式,也带来了有效的数字签名算法。使用椭圆曲线公钥密码技术以及基于椭圆曲线的数字签名技术,同时使用数字证书完成公钥的分发。

完整性是指系统能够保护账本数据免受未授权的修改,具有检测区块是否被篡改的能力。哈希函数是实现完整性保护的主要工具。区块链系统中至少包含2个层级的完整性保护。首先,一组账本数据的全局状态由Merkle哈希树所保护,其根哈希存储于区块中。这组数据内的任意信息改变都可能导致一个新的根哈希值,从而导致整个区块哈希值的改变。其次,通过哈希指针的使用,区块的历史,即账本的历史记录,能够得到保护,这使得区块一旦添加到区块链中,其内容就不可改变。

Hash(哈希)算法

哈希算法,又称散列算法,它是一类数学方法,将任意长度的二进制值转换成较短的固定长度的二进制值,这个二进制值叫作哈希值,哈希算法的公式如下: h=hash(X)其中x表示任意长度的二进制串,hash表示哈希函数,h表示生成的固定长度的哈希值。

哈希算法利用任意长度的数据作为输入,生成一个固定长度的确定结果,即输入数据的数字指纹。对于任意特定的输入,结果总是相同的,只要实现了相同哈希算法,都可以轻易计算并验证。加密哈希算法的关键特性是对于两个不同的输入,几乎不可能生成相同的指纹。几乎不可能是指----哈希函数的安全性是指在现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的。

密码学哈希函数可以视为一类满足安全性需求的哈希函数。它能够在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,然而却很难在有限合理的时间内找到这个二进制串的碰撞。以密码学哈希函数为基础构造的哈希算法,在现代密码学中扮演着重要的角色,常用于实现数据完整性和实体认证,同时也构成多种密码体制和协议的安全保障。

具有以下三个特性:

  • 其输入可为任意大小的字符串。
  • 产生固定大小的输出。
  • 它能进行有效计算,简单来说就是对于特定的输入字符串,在合理时间内,我们可以算出哈希函数的输出。更准确地说,对应n位的字符串,其哈希值计算的复杂度为O(n)。

特点

  • 单向性 指知道输入值可以很容易通过函数计算出函数值,但知道函数值却难以计算出原来的输入值。 哈希函数的原像在计算上是不可逆的,这意味着依据哈希函数的输出是不能计算出该哈希函数的输入的,即已知H(m),试图计算出原始消息m在计算上是不可行的。

  • 确定性 扛碰撞性

    碰撞是与哈希函数相关的重要概念,两个不同的消息在同一个哈希函数作用下,若产生相同的哈希值,即形成碰撞,哈希函数H的抗碰撞性使得寻找两个不同的、能够产生碰撞的消息在计算上是不可行的。 哈希函数的抗碰撞特性常被用来进行完整性验证。由于抗碰撞性,我们可以把哈希值作为原始输入消息的指纹(因为很难找到另一个消息经哈希运算之后得到相同的哈希值)。如果原始输入消息在传输过程中被篡改,那么经过哈希函数处理后得到的新哈希值就会和原来的哈希值不一样,这样很容易就能发现消息的完整性在传输过程中受到破坏。 对区块链来说,哈希函数的抗碰撞性可以用来做区块和交易的完整性验证。在区块链中,第n+1号区块的头部信息中会存储着第n号区块信息的哈希值。如果能拿到第n号区块的信息,任何用户都可以通过简单的比对计算得出第n号区块的哈希值,并与存储在第n+1号区块中的第n号区块哈希值进行比较,检测第n号区块的信息完整性。

  • 哈希算法是区块链中保证交易信息不被篡改的单向密码机制,对于任意一个输入,哪怕是很小的改动,其哈希值改变也会非常大,所以可以用哈希值判断内容是否被篡改,防篡改是哈希算法的主要应用场景。

用途

  • 信息查询:区块链的哈希值能够唯一而精准地标识一个区块,区块链中任意节点通过简单的哈希计算都可获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块链中的信息没有被篡改。

  • 数据校验:由于哈希算法抗篡改的特性,可以利用哈希值进行数据的校验。在区块链网络中发送信息和传送文件的时候,经常会通过 MD5算法校验数据的正确性和完整性。

  • 哈希指针:哈希指针是一种数据结构,是一个指向数据存储位置及其位置数据的哈希值的指针。一个普通指针只能告诉你数据的位置,哈希指针除了告诉你数据位置,还提供一种方法让你验证数据是否被篡改过。在区块链中,SHA-256算法被用来生成哈希指针,标识区块和检验的区块的正确性。

      • 通过哈希指针构建一个链表,我们将这个数据结构称为区块链(block chain)。在普通链表中有一系列区块,每个a区块既有数据也有一个指向上一个区块的指针。而在区块链中,上一个区块指针被置换为哈希指针。因此,每个区块不仅能告诉我们上一个区块的值在哪里,还包含了该值的摘要,使我们能够验证那个值没有改变。我们存储链表头部(the head of list),即一个普通的哈希指针指向最近使用的数据区块。
      • 默克尔树:用哈希指针建立的有用的数据结构是二叉树。使用哈希指针的二叉树也叫作默克尔树。假设我们有很多包含数据的区块,这些区块就构成了树的叶子(节点)。我们将这些数据区块两两分组,然后为每一组建立一个有两个哈希指针的数据结构,每个指针对应一个区块,这些数据结构就构成了树的下一个层次。我们轮流将这些区块组两两分组,为每一组建立一个包含每个区块组哈希指针的新的数据结构。以此类推,直到我们得到一个单一区块,即树根节点。如上所述,我们要记住树最前面的哈希指针。我们现在可以通过哈希指针回溯到列表中的任何位置,这让我们能保证数据确实未经篡改,正如我们在区块链见过的一样,如果对手篡改了树底部的一些数据区块,会导致上一层的哈希指针不匹配,即使他继续篡改这个区块,改动数据行为将最终传递到树的顶端,而此时,他将不能篡改我们存储的哈希指针。因此,同样地仅仅通过记住顶部的哈希指针,任何企图篡改任何数据的行为都会被检测到。
  • 数字摘要:数字摘要是对数字内容进行哈希运算,获取唯一的摘要值来指代原始完整的数字内容。数字摘要是哈希算法最重要的一个用途。用哈希函数的抗碰撞特性,数字摘要可以解决确保内容未被篡改过的问题。

非对称加密算法采用了两个相关的密钥:一个密钥是公开(公钥),另一个密钥是保密的(私钥)。非对称加密算法,解决了密钥分发传输的问题,而私钥加密–公钥解密的应用模式,也带来了有效的数字签名算法。区块链系统中还使用了椭圆曲线公钥密码技术以及基于椭圆曲线的数字签名技术,同时使用数字证书完成公钥的分发。

非对称加密算法

  • 公钥 私钥

    公私钥对是区块链所使用的密码学的基石。公私钥对包含两部分:公钥和私钥。这两个密钥是具有特定数学关系的大整数,用于代替密码和用户名

    公钥:比喻性的理解--可视为账户,公钥就是身份。

    私钥:比喻性的理解--可视为密码

  • 对称加密 非对称加密

    对称加密:对称加密,是一种需要对加密和解密使用相同密钥的加密算法

    非对称加密:非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。这里的“公钥”是可以对外公布的,“私钥”则不能.

数字签名

在双方通信过程中,发送方用自己的私钥加密需传输的信息形成数字签名后,连同原始信息发给接收方,接收方使用发送方的公钥验证签名,以确认所收到的信息就是发送方发送的信息。

数字签名的基础是非对称加密。非对称加密意味着存在两个密钥,即在数学上彼此相关的一个公钥和一个私钥。这种关系意味着,任何由其中一个密钥(公钥)加密的数据只能由另一个密钥(私钥)解密,反之亦然。对于某个公钥加密的数据,想要用另一个公钥去解密是不可能的。因此,你可以使用密钥来标识特定数字资产的所有者。由于公钥是公开提供的,因此任何使用特定私钥加密的数据都只能由对应的公钥来解密。

为了实现交易信息或者区块信息的来源可靠性保障,需要将传递的交易信息或者区块信息通过哈希计算得到相应的数字摘要,然后使用发送者的私钥进行加密,得到相应的数字签名,并将数字签名通过网络传递到接收方。如果接收方使用发送方的公钥能够解开该数字签名,则证明该数字签名的确为该发送者所签署,来源可靠;如果接收方使用发送者的公钥不能解开该数字签名,则证明该数字签名不是该发送者所签署,来源不可靠。

数字证书

数字证书是一个证书权威机构(CA)对一个实体所拥有的公钥的认证证书。CA是这个证书的签发机构,为通信双方所共同信任,作为受信任的第三方,承担公钥体系中公钥的合法性检验的责任。一个最简单的证书包含实体名称、实体的公开密钥以及CA的数字签名。目前大量采用的数字证书格式遵循X.509国际标准。

椭圆曲线数字签名算法

比特币区块链中采用了椭圆曲线公钥密码技术,其所使用的椭圆曲线为Certicom推荐的secp256k1椭圆曲线。椭圆曲线密码(Elliptic Curve Cryptography,ECC)算法是基于椭圆曲线数学的一种公钥密码的算法,其安全性依赖于椭圆曲线离散对数问题的困难性。

椭圆曲线密码算法具有下面两个明显的优点:

1)短的密钥长度,这意味着小的带宽和存储要求; 2)所有的用户可以选择同一基域上的不同的椭圆曲线,可使所有的用户使用同样的操作完成域运算。 椭圆曲线可以定义如下: 设p是一个大于3的素数,在有限域Fp上的椭圆曲线y2=x3+ax+b由一个基于同余式y2=x3+ax+b mod p的解集(x,y)∈Fp×Fp和一个称为无穷远点的特定点O组成,这里a,b∈Fp是两个满足4a3+27b2≠0mod p的常数。

Certicom是国际上最著名的椭圆曲线密码技术公司,已授权300多家企业使用ECC密码技术,secp256k1为基于Fp有限域上的椭圆曲线,由于其构造的特殊性,其优化后的实现比其他曲线性能上可以提高30%。

比特币系统的区块链实现中使用的椭圆曲线为Certicom推荐的椭圆曲线secp256k1。 Certicom是国际上著名的椭圆曲线密码技术公司,已授权300多家企业使用ECC密码技术,secp256k1为基于Fp有限域上的椭圆曲线,由于其构造的特殊性,其优化后的实现比其他曲线性能上可以提高30%,对比NIST推荐的曲线,secp256k1的常数以可以预测的方法选择,可以有效避免后门出现的可能性。

Alice决定把10个比特币支付给Bob,矿工负责把这笔账给记录下来。这个过程是怎么使用签名和验证算法进行的呢? 首先Alice从自己钱包中取出10个比特币,要将这10个比特币支付给Bob,于是交易消息m产生了:Alice支付10BTC给Bob。由于这个消息需要向全网广播,收到这个交易消息的用户会发生疑问:这个交易是不是真的?为打消其他用户的疑虑,Alice需要对这段交易消息进行数字签名,以向大家确定这个交易确实是Alice发出的。为此,Alice使用了secp256k1椭圆曲线。签名本质上是对交易消息内容进行使用Alice的私钥k加密(签名算法的第6步)。考虑到消息的规模和公钥密码算法的效率,对交易消息进行的签名实际上是对交易消息的哈希值进行签名,由于密码哈希函数的抗碰撞性,可以认为这样的转化是合理有效的。于是Alice向全网广播的内容除了交易消息本身外,还包含Alice对消息的签名以及Alice的公钥信息。 其次,Alice发送的交易消息连同签名发出后,为矿工Miner所接收。为在区块链中记录这一交易,矿工首先需要验证这个交易是不是Alice发出的,即进行签名验证的工作。为此,Miner也使用了同样的secp256k1椭圆曲线。对Alice签名验证的过程可以看作利用Alice公钥进行解密的过程,如签名验证算法中的第5步就使用了Alice的公钥Q。当一切顺利的话,Miner可以验证交易消息:Alice支付10BTC给Bob确实是Alice发出的,Miner可以在之后的操作中把这个交易记入区块链中。如果签名验证失败,表明Miner收到的这个消息存在问题,Miner会放弃将相关的交易记入区块链的操作。 利用椭圆曲线的签名和验证算法,一方面可以保证用户的账户不被冒名顶替,另一方面也能确保用户不能否认其所签名的交易。用户发起交易的时候,使用自己的私钥对交易信息签名,矿工收到信息后用用户的公钥对签名进行验证,一旦通过,该交易信息就可通过矿工进行记账,最终完成交易。